import { Module } from '@nestjs/common';
import { StudentsService } from './students.service';
import { StudentsService2 } from './students.service2';
import { StudentsService3 } from './students.service3';
import { StudentsController } from './students.controller';
// 本质上起到了IOC依赖注入的容器的作用
@Module({
  controllers: [StudentsController],
  // 第一种用法就是一个语法糖
  // providers: [StudentsService],

  // 第二种用法(自定义名称)
  // providers: [{
  //   provide: 'mingle',
  //   useClass: StudentsService
  // }],

  // 第三种自定义注入值
  // providers: [{
  //   provide: 'mingle',
  //   useClass: StudentsService
  // },
  // {
  // provide: 'JS',
  // useValue: ['CSS', 'HTML', 'VUE']
  // }],
  
  // 第四种 工厂模式:如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory
  // providers: [{
  //     provide: 'mingle',
  //     useClass: StudentsService
  //   },
  //   {
  //     provide: 'JS',
  //     useValue: ['CSS', 'HTML', 'VUE']
  //   },
  //   StudentsService2,
  //   {
  //     provide: 'Test',
  //     inject: [StudentsService2],
  //     useFactory: function (StudentsService2: StudentsService2) {
  //       return new StudentsService3(StudentsService2);
  //     }
  //   }
  // ],

  // 第五种 异步模式:useFactory 返回一个promise 或者其他异步操作
  providers: [{
    provide: 'mingle',
    useClass: StudentsService
  },
  {
    provide: 'JS',
    useValue: ['CSS', 'HTML', 'VUE']
  },
  StudentsService2,
  {
    provide: 'Test',
    inject: [StudentsService2],
    useFactory: function (StudentsService2: StudentsService2) {
      return new StudentsService3(StudentsService2);
    }
    },
  {
    provide: 'async',
    useFactory() {
      return new Promise((resolve, reject) => {
        setTimeout(() => { 
          resolve('async');
        }, 3000);
      })
    }
  }
],
})
export class StudentsModule {}
